import cv2

def face_recognition():
    # 加载人脸检测的分类器
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

    # 加载人脸识别的模型
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.read('face_model.xml')

    # 打开摄像头
    cap = cv2.VideoCapture(0)

    while True:
        # 读取视频流的帧
        ret, frame = cap.read()

        # 将帧转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 基于分类器检测人脸
        faces = face_cascade.detectMultiScale(gray, 1.1, 4)

        # 在帧上标记检测到的人脸并进行识别
        for (x, y, w, h) in faces:
            # 裁剪出人脸区域
            face_roi = gray[y:y+h, x:x+w]

            # 进行人脸识别
            label, confidence = recognizer.predict(face_roi)

            # 绘制人脸矩形框
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

            # 在矩形框上显示识别结果
            if confidence < 70:  # 设置相似度阈值为70
                 # 显示识别结果标签和置信度
                text = "Person: {} Confidence: {:.2f}".format(label, confidence)
                return  False
            else:
                # 如果置信度超过70，则显示成功
                return  True
        

            cv2.putText(frame, text, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2, cv2.LINE_AA)

        # 显示结果帧
        cv2.imshow('Face Recognition', frame)

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 关闭摄像头和窗口
    cap.release()
    cv2.destroyAllWindows()

# 调用人脸识别函数
face_recognition()